//第一步 初始化外面的包 npm init -y
//第二步 搭建服务器
//第三步 连接数据库 引入 mongoose  安装npm i mongoose 
const http = require('http')
const app = http.createServer()
//解析post请求数据
const querystring = require('querystring')

//解析get 传递过来的数据
const url = require('url')
var modfiyId = ''
//第三步连接我们的数据库 安装npm i mongoose
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground222', {
    useUnifiedTopology: true,
    useNewUrlParser: true
})
.then(() => {
        console.log('数据库连接成功');

    }).catch(err => console.log(err, '数据库连接失败'))
//创建集合规则
const myinfor = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        minlength: [2, '最小不得少于2个字符'],
        maxlength: [100, '最大不得少于100个字符'],
    },
    age: {
        type: Number,
        min: [5, '填写的年龄不能低于5'],
        max: [10000, '填写的年龄最大不得大于10000']
    },
    sex: String,
    email: String,
    hobbies: [String],
    collage: String,
    enterDate: {
        type: Date,
        default: Date.now
    }

})

//调用创建集合规则进行创建
const myInfor = mongoose.model('Myinfor', myinfor)

//安装模板引擎 npm i art-template 
//引入模板
const template = require('art-template')
//引入path模块
const path = require('path')
template.defaults.root = path.join(__dirname, 'views')

//1.格式化时间 安装第三方模块 npm i dateformat
//2.引入
//3.自定义
const dateFormat = require('dateformat')
template.defaults.imports.myformat = dateFormat




//静态资源托管 一般我们需要托管的是第三方css  less img 字体图标
//托管静态的css  
//第一步 安装 npm i serve-static
//第二步 引入 serve-static
const serveStatic = require('serve-static')
//第三步 使用serve-static
const serve = serveStatic(path.join(__dirname, 'public'))
//第四步 把托管后的返回值，在服务上挂载




//实现 node js的路由功能   安装方法 npm i router
//1.第一步引入路由
const Router = require('router')
//2.调用路由
const router = Router()
//3.测试路由功能 (监听路由)
router.get('/list', async (req, res) => {
    //list路由
    // 1.从数据库里面读取数据 find 
    // 2.把读取到的数据采用

    let allData = await myInfor.find({})
    // console.log(allData); //数组
    // 把数据包装成对象
    let obj = {
        myallData: allData
    }

    let html = template('list.art', obj)
    res.end(html)
})


router.get('/add', (req, res) => {
    //get请求 进入倒/add 这个路由的时候应该需要加载我们添加数据页面
    // template('第一个参数是模板名称','第二个参数是我们的需要加载的数据')
    let html = template('index.art', {})
    res.end(html)
})
//get提交 req.url
//post 提交 特别是表单提交，一定要有属性，所以在模板里， 需要给所有的input里面设置name属性
//表单提交数据 进行post请求 路由来监听
router.post('/add', (req, res) => { 
    //post 提交数据，我们怎么获取post提交过来的参数

    let formData = ''
    req.on('data', (params) => {
        formData += params
    })
  //req 这里是代表请求，这里下次书写的时候千万不能弄错了！！
    req.on('end', async() => {

        let data = querystring.parse(formData)
        // console.log(data);

        //向我们的数据库里面添加数据
        //方法一：
        // myInfor.create(data).then(res => {
        //     console.log(res);

        // })

        //方法二
        let scuessData = await myInfor.create(data)  

        // console.log(scuessData);

    })
    //跳转到/list 路由  301重定向到/list
    res.writeHead(301, {
        Location: '/list'
    })

    res.end()

})


//4.删除功能
router.get('/remove', async (req, res) => {
    //1.获取当前传递过来的id
    //2.根据id可以在数据库里面查询，找到对应的进行删掉
    //3.重新跳转到/list路由
    let myid = url.parse(req.url, true).query.id
    let delData = await myInfor.findOneAndDelete({
        _id: myid
    })

    // console.log(delData);

    //重定向完了之后，必须要加上res.end()

    res.writeHead(301, {
        Location: '/list'
    })
    res.end()
})

//5.修改功能  更新功能
//1.第一步 把之前的值进行渲染
// router.get('/modify', async (req, res) => {
//     //修改的时候get过来需要做的事情
//     //1.获取get 传递过来的id
//     //2.根据id 去数据库里面查询对应的数据
//     //3.把查询出来的数据，通过模板引擎 进行展示

//     modfiyId = url.parse(req.url, true).query.id
//     // console.log(myid);
//     //去数据库查询
//     let findData = await myInfor.findOne({
//         _id: modfiyId
//     })
//     let html = template('index2.art', findData)
//     res.end(html)
// })


router.get('/modify', async (req, res) => {
    /**
     *  修改的时候get 过来需要做的事情
     * 1 获取get 传递过来的id  
     * 2 根据 id  去数据库里面查询对应的数据
     * 3 把查询出来的数据 通过模板引擎 进行展示
     */

    modfiyId = url.parse(req.url, true).query.id
    // console.log(myid);
    //去数据库查询 
    let findData = await myInfor.findOne({
        _id: modfiyId
    })
    // console.log(findData);

    let html = template('index2.art', findData)

    res.end(html)
})

//第二步  修改完数据后题的时候是post请求
//然后需要采用post请求方式获取数据

router.post('/modify', (req, res) => {
    let myid = modfiyId
    console.log(myid);
    let modfiyData = '';
    req.on('data', (params) => {
        modfiyData += params
    })
    req.on('end', async () => {
        let obj = querystring.parse(modfiyData) //修改完之后的数据
        // console.log(obj);
        //更新数据库
        let modfiyRes = await myInfor.updateOne({
            _id: myid
        }, obj)
        res.writeHead(301, {
            Location: '/list'
        })
        res.end()
    })
})





//4.路由进行挂载在服务器上
app.on('request', (req, res) => {
    //4.路由进行挂载在服务器上
    router(req, res, () => {  //这个回调函数必须要写，可以什么都不触发，但是要写
        // console.log('路由触发了');
    })

    serve(req, res, () => {
        // console.log('css静态资源被托管了');

    })
})

app.listen(8888, () => {
    console.log('http://localhost:8888')

})






